import pygame
import random
from game_items import *
from game_hud import *
from game_music import *


class Game(object):
    '''游戏类'''
    def __init__(self):
        #游戏主窗口
        self.main_window = pygame.display.set_mode(SCREEN_RECT.size)
        pygame.display.set_caption("飞机大战")
        #游戏状态属性
        self.is_game_over = False            #游戏结束标记
        self.is_pause = False               #游戏暂停标记

        #精灵属性
        self.all_group = pygame.sprite.Group()      #所有精灵组
        self.enemies_group = pygame.sprite.Group()  #敌机精灵组
        self.supplis_group = pygame.sprite.Group()  #道具精灵族

        #创建精灵
        #背景精灵，向下方移动
        #Gamesprite("background.png",1,self.all_group)
        #修改精灵，交替滚动
        self.all_group.add(Background(False),Background(True))




        #英雄精灵，静止不动
        #hero = Gamesprite("me1.png",0,self.all_group)
        #hero = Plane(["me%d.png" % i for i in range(1,3)],self.all_group)
        self.hero = Plane(1000,5,0,"me_down.wav",
                            ["me%d.png" % i for i in range(1,3)],
                            "me1.png",["me_destroy_%d.png"% i for i in range(1,5)],self.all_group)
        self.hero.rect.center =SCREEN_RECT.center     #显示在屏幕中央


        #指示器面板
        self.hud_panel = HudPanel(self.all_group)

        #创建敌机
        self.create_enemies()

        ##英雄精灵
        #self.hero = Hero(self.all_group)
        #设置炸弹数量
        #self.hud_panel.show_bomb(self.hero.bomb_count)

    def create_enemies(self):
        """根据游戏级别创建不同数量敌机"""
        #敌机精灵组精灵数量
        count = len(self.enemies_group.sprites())
        #要添加的精灵组
        groups = (self.all_group,self.enemies_group)
        #判断游戏级别已有敌机数量
        if self.hud_panel.level ==1 and count ==0:          #管卡一
            for i in range(16):
                Enemy(0,3,*groups)
        elif self.hud_panel.level ==2 and count ==16:       #关卡二
            #1> 增加敌机最大速度
            for enemy in self.enemies_group.sprites():
                enemy.max_speed = 5
            #2创建敌机
            for i in range(8):
                Enemy(0,5,*groups)
            for i in range(2):
                Enemy(0,5,*groups)
        elif self.hud_panel.level ==3 and count ==26:       #关卡3
            #1>增加敌机最大速度
            for enemy in self.enemies_group.sprites():
                enemy.max_speed =7 if enemy.kind == 0 else 3
            #2>创建敌机
            for i in range(8):
                Enemy(0,7,*groups)
            for i in range(2):
                Enemy(1,3,*groups)
            for i in range(2):
                Enemy(2,1,*groups)



    def reset_game(self):
        """重置游戏"""
        self.is_game_over = False           #游戏结束标记
        self.is_paise = False               #游戏暂停标记

    def reset_game(self):
        """"重置游戏"""
        self.is_game_over = False    #游戏结束标记
        self.is_pause = False       #游戏暂停标记
        self.hud_panel.reset_panel()       #重置指示器面板

    def event_handler(self):
        """事件监听
        :return:如果监听到退出事件,返回true,否则返回false
        """
        for event in pygame.event.get():
            if event.type ==pygame.QUIT:
                return True
            elif event.type ==pygame.KEYDOWN and event.key ==pygame.K_ESCAPE:
                return True
            elif event.type ==pygame.KEYDOWN and event.key ==pygame.K_SPACE:
                if self.is_game_over:   #youxijieshu
                    self.reset_game()  #重新开始
                else:
                    self.is_pause = not self.is_pause    #暂停 

            #判断是否正在游戏
            if not self.is_game_over and not self.is_pause:
                #监听玩家按下b，引爆炸弹
                if event.type == pygame.KEYDOWN and event.key == pygame.K_b:
                    #TODD 测试炸弹数量变化
                    self.hud_panel.show_bomb(random.randint(0,100))
                    #TODO测试生命计数适量变化
                    self.hud_panel.lives_count = random.randint(0,10)
                    self.hud_panel.show_lives()
                    #TODO测试停止后是否可以重新开始游戏
                    self.hud_panel.lives_count = 0 
                    #TODO 测试炸毁所有敌机
                    for enemy in self.enemies_group.sprites():
                        enemy.hp =0

        return False
    def start(self):
        """开始游戏"""             
        clock = pygame.time.Clock()    #游戏时钟
        frame_counter = 0           #逐帧动画计数器
        while True:                  #开始游戏循环
            #生命计数=0，表示游戏结束
            self.is_game_over = self.hud_panel.lives_count ==0
            if self.event_handler():         #事件监听
                self.hud_panel.save_best_score()
                return
            #判断游戏状态
            if self.is_game_over:
                #print('游戏结束，按空格键重新开始')center
                self.hud_panel.panel_pause(True,self.all_group)
            elif self.is_pause:
                #print('游戏暂停，按空格键继续')
                self.hud_panel.panel_pause(False,self.all_group)
            else:
                self.hud_panel.panel_resume(self.all_group)
                # print('游戏进行中....')
                # TODO 测试修改游戏的分
                #if self.hud_panel.increase_score(100):
                   # print("升级到 %d" %self.hud_panel.level)
                    #self.create_enemies()
                #TODO 模拟英雄飞机收到伤害
                self.hero.hp -= 30
                #修改逐帧动画计时器
                frame_counter = (frame_counter +1)% FRAME_INTERVAL

                #更新 all_group.Update(),更新所有精灵
                self.all_group.update(frame_counter ==0)
            #绘制all_group所有精灵
            self.all_group.draw(self.main_window)
            pygame.display.update()    #更新显示
            clock.tick(60)        #设置刷新帧率

if __name__=="__main__":
    pygame.init()           #初始化pygame
    Game().start()          #通过Game()创建对象并调用start方法开始游戏
    pygame.quit()           #退出pygame


